iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 7

DAY 7 Go 語言 常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope)

  • 分享至 

  • xImage
  •  

昨天我們學到了Go 語言 值與指標 (pointers) ,今天繼續來了解常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope) 吧!

常數 (constants) 是什麼?怎麼用?

常數跟變數其實常常拿來一起說明,因為兩者的差異只在於,常數在定義之後是 無法修改初始值 的。
而常數的宣告我們只需要把變數的 var 換成 const ,前面有說過因為初始值不可修改,所以在宣告常數時,也要給初始值,而這個初始值可以是一個 運算式 ,也可以是其他的 常數

範例 4:

package main

import "fmt"

const TWCountryCode = "+886" // 台灣的手機國碼是 +886 ,這目前是固定的數,所以我們將他定義為常數

func setCellphone(number string)string{
    return (TWCountryCode+number) // 將傳入的手機號碼加上國碼
}

func main (){
    fmt.Println(setCellphone("987654321")) // 寫入資料並印出含有國碼的手機號碼
}

範例 4(執行結果):

+886987654321

列舉 (enums) 與好用的 iota

定義多個值是整數的常數,而這些常數會彼此相關,在 Go 語言中提供一種稱為 iota 的小工具,來簡化彼此相關且值為遞增的列舉。 好了又開始聽不懂了,請說白話文...
簡單來說 iota 預設值是 0,每次當 const 呼叫宣告時,就會加 1,直到遇到下一個 const 宣告 iota 時,才會重置為 0。

範例 5(執行結果):

package main

import "fmt"

const (
    zero = iota // 預設值是 0
    one // 會自動加一,所以為 2(以下依此類推)
    two	 
    three
    four
)

const (
    Sunday = iota // 重新宣告一個 const 時,iota 會重置為 0
    Monday	 
    Tuesday
)

func main() {
    fmt.Println(zero,one,two,three,four,Sunday,Monday,Tuesday)
}

範例 5(執行結果):

0 1 2 3 4 0 1 2

變數作用範圍 (Scope)

Go 語言中,所有變數都有運作的 範圍 (Scope) ,或稱為 層級作用域 ,其中最上層的範圍是 套件(package) ,而每個 Scope 裡又可以包含其他的子 Scope ,而找到子 Scope 很簡單,就是 { } 內的變數都屬於子範圍內的變數。

當執行程式碼時要取得變數時,會先在當個範圍內尋找,若是子 Scope 裡沒有該變數,則會往上層尋找,若一路找到最上層 package 還是找不到,則會報錯。

補充:
若是找到同名但是型別不同的變數,也是會報錯的喔!

範例 6:

package main

import "fmt"

var favoriteFruit = "kiwi" // 在最外層宣告最愛的水果是 kiwi

func main() {
    fmt.Println("package main favorite:", favoriteFruit) // 程式碼執行到這時,func main 還沒有同名 favoriteFruit 這個變數,所以找到外層的 kiwi

    favoriteFruit := "apple" // 在 func main 內更改變數值為 apple
    if true {
        favoriteFruit := "peach" // 在 if block 內更改變數值為 peach
        fmt.Println("if block favorite:", favoriteFruit) // 因為在 if block 內有找到favoriteFruit,所以可以直接印出值為 peach
        fruit() // 呼叫 func fruit
    }
    fmt.Println("func main favorite:", favoriteFruit) // 雖然順序在 if block 下會有點讓人誤會,但是仔細劃分好區域,會發現它的 scope 是在 func main 內的,所以找到值為 apple
}

func fruit(){
    favoriteFruit := "mango" // 在 func fruit 內更改變數值為 mango
    fmt.Println("func fruit favorite:", favoriteFruit) // 這邊 func fruit 又是自己的 scope ,無論在哪裡呼叫,他會先找到最近的 favoriteFruit ,也就是 mango
}

範例 6(執行結果):

package main favorite: kiwi
if block favorite: peach
func fruit favorite: mango
func main favorite: apple

補充:
當我們在定義變數時,可以先想到此變數的作用範圍,再決定要將變數定義在哪,如此一來可以更精準控制每一個變數。

雖然一開始對於變數的 scope 可能會比較陌生,但是當把每個 scope 拆分畫出來,就可以很清楚知道,到哪裡該找誰,我都是記為有近的找近的,沒有往外找,在沒有就錯啦
明天我們要來學習邏輯判斷,也就是前面有些範例已經偷偷出現過的 if...else...,那我們明天見~


上一篇
DAY 6 Go 語言 值與指標 (pointers) 是什麼?
下一篇
DAY 8 Go 語言 條件判斷 - if ... else 敘述
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言